package main

import (
	"bufio"
	"fmt"
	"io"
	_ "io/ioutil"
	"os"
)

func main() {
	//file,err := os.Open("filePath")  // 打开文件，返回值为 file,err
	//file.Close()  // 关闭文件

	//reader := bufio.NewReader(file)  //创建一个带缓冲区的*Reader
	//str, err := reader.ReadString('\n')  // 读取文件内容，读到换行结束

	file, err := os.Open("E:\\Goproject\\src\\learn\\base\\文件操作\\命令行参数.go")
	if err != nil{
		fmt.Println("打开错误", err)
	}
	defer file.Close()  // 函数退出时，关闭文件

	reader := bufio.NewReader(file)  //创建reader对象
	for {
		// 循环读取文件内容，每次只能读取一行
		str, err := reader.ReadString('\n')  //此处双引号报错
		if err == io.EOF {  // io.EOF表示文件结尾
			break
		}
		fmt.Println(str)
	}

	fmt.Println("读取结束")

	//ioutil将文件一次读取/写入到内存中[仅使用文件不大的情况]
	// 文件的open close被封装
	//file := "filePath"
	//content, err := ioutil.ReadFile(file)  // 返回的content为[]byte类型
	//err := ioutil.WriteFile(filePath, content, 0666)  // 写到另一个文件中
	//string(content) 输出

	// 写文件操作
	//os.OpenFile(name string, flag int, perm FileMode) (*File, error)
	//	name 文件名
	//	flag 打开文件模式，可以组合。在os包Constants中包含
	//	const (
	//		O_RDONLY int = syscall.O_RDONLY // 只读模式打开文件
	//		O_WRONLY int = syscall.O_WRONLY // 只写模式打开文件
	//		O_RDWR   int = syscall.O_RDWR   // 读写模式打开文件
	//		O_APPEND int = syscall.O_APPEND // 写操作时将数据附加到文件尾部
	//		O_CREATE int = syscall.O_CREAT  // 如果不存在将创建一个新文件
	//		O_EXCL   int = syscall.O_EXCL   // 和O_CREATE配合使用，文件必须不存在
	//		O_SYNC   int = syscall.O_SYNC   // 打开文件用于同步I/O
	//		O_TRUNC  int = syscall.O_TRUNC  // 如果可能，打开时清空文件
	//	)
	//	perm 文件模式，仅在Unix系系统中可行，权限控制（r-4,w-2,x-1）
	filePath := "E:\\Goproject\\src\\learn\\base\\文件操作\\t.txt"
	//filePath := `"E:\Goproject\src\learn\base\文件操作\t.txt"`
	fileT,err := os.OpenFile(filePath, os.O_WRONLY | os.O_CREATE | os.O_APPEND, 0666)
	if err != nil{
		fmt.Println("open err", err)
		return
	}
	defer fileT.Close()

	// 要写入字符
	str := "hello go\r\n"
	// 创建bufio 写对象
	writer := bufio.NewWriter(fileT)
	writer.WriteString(str)
	// 因为writer带缓存，在调用WriterString时，内容是先写入缓存的，需要使用flush方法，将
	//缓冲的数据真正写入到文件中
	writer.Flush()

	//Write需要将str转换为byte类型切片
	//writer.Write([]byte(str))

	// 使用io.Copy(dst Writer, src Reader) 将源文件src中内容拷贝到目标文件dst中
	//io.Copy(writer, reader)
	//另外两个
	//io.CopyN(dst,src,n) 为复制src 中 n 个字节到 dst。
	//io.CopyBuffer(dst,src,buf)为指定一个buf缓存区，以这个大小完全复制

	// 判断文件是否存在
	//使用os.Stat()函数返回值来进行判断
	//	如果返回值错误为nil，说明文件存在
	//	如果返回值错误类型使用os.IsNotExist()判断为true，说明文件不存在
	//	为其他类型，则不确定
	//_, err := os.Stat(filePath)
	//if err == nil{
	//	// 文件存在
	//	return true
	//}
	//if os.IsNotExist(err){
	//	// 文件不存在
	//	return false
	//}

}
